package com.chongchong.online.controller;

import cn.jimmyshi.beanquery.BeanQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chongchong.common.constant.ErrorCodeEnum;
import com.chongchong.common.tool.CommonUtil;
import com.chongchong.common.validator.UpdateGroup;
import com.chongchong.core.mp.object.MyModelUtil;
import com.chongchong.core.mp.object.MyOrderParam;
import com.chongchong.core.mp.object.MyRelationParam;
import com.chongchong.core.mp.support.Condition;
import com.chongchong.core.mp.support.Query;
import com.chongchong.core.tool.api.R;
import com.chongchong.online.dto.OnlineTableDto;
import com.chongchong.online.entity.OnlineTable;
import com.chongchong.online.service.IOnlineTableService;
import com.chongchong.online.vo.OnlineTableVo;
import com.chongchong.online.wrapper.OnlineTableWrapper;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.groups.Default;
import java.util.List;
import java.util.Map;

/**
 * 数据表操作控制器类。
 *
 * @author Jerry
 * @date 2021-06-06
 */
@Api(tags = "数据表操作接口")
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/onlinetable")
public class OnlineTableController {

    private IOnlineTableService onlineTableService;

    /**
     * 更新数据表数据。
     *
     * @param onlineTableDto 更新对象。
     * @return 应答结果对象。
     */
    @PostMapping("/update")
    public R<Void> update(@RequestBody OnlineTableDto onlineTableDto) {
        String errorMessage = CommonUtil.getModelValidationError(onlineTableDto, Default.class, UpdateGroup.class);
        if (errorMessage != null) {
            return R.fail(errorMessage);
        }
        OnlineTable onlineTable = MyModelUtil.copyTo(onlineTableDto, OnlineTable.class);
        OnlineTable originalOnlineTable = onlineTableService.getById(onlineTable.getTableId());
        if (originalOnlineTable == null) {
            // NOTE: 修改下面方括号中的话述
            errorMessage = "数据验证失败，当前在线数据表并不存在，请刷新后重试！";
            return R.fail(errorMessage);
        }
        if (!onlineTableService.update(onlineTable, originalOnlineTable)) {
            return R.fail(ErrorCodeEnum.DATA_NOT_EXIST.getErrorMessage());
        }
        return R.data(null);
    }

    /**
     * 列出符合过滤条件的数据表列表。
     *
     * @param onlineTable 过滤对象。
     * @param orderParam           排序参数。
     * @param query            分页参数。
     * @return 应答结果对象，包含查询结果集。
     */
    @GetMapping("/list")
	public R<IPage<OnlineTableVo>> list(OnlineTable onlineTable,
										MyOrderParam orderParam, Query query) {
		String orderBy = MyOrderParam.buildOrderBy(orderParam, OnlineTable.class);
		List<OnlineTable> onlineTableList =
			onlineTableService.getOnlineTableListWithRelation(onlineTable, orderBy);

//		IPage<OnlineTable> pages = onlineTableService.page(Condition.getPage(query), Condition.getQueryWrapper(flowWorkOrder));

		IPage<OnlineTable> pages = new Page<>(query.getCurrent(), query.getSize());
		pages.setRecords(onlineTableList);

		return R.data(OnlineTableWrapper.build().pageVO(pages));
	}

	/**
	 * 列出符合过滤条件的数据表列表。
	 *
	 * @param onlineTable 过滤对象。
	 * @return 应答结果对象，包含查询结果集。
	 */
	@GetMapping("/listNoPage")
	public R<List<OnlineTableVo>> listNoPage( OnlineTable onlineTable ) {
		List<OnlineTable> onlineTableList = onlineTableService.list(Condition.getQueryWrapper(onlineTable));

		return R.data(OnlineTableWrapper.build().listVO(onlineTableList));
	}

    /**
     * 查看指定数据表对象详情。
     *
     * @param tableId 指定对象主键Id。
     * @return 应答结果对象，包含对象详情。
     */
    @GetMapping("/view")
    public R<OnlineTableVo> view(@RequestParam Long tableId) {
        if (CommonUtil.existBlankArgument(tableId)) {
            return R.fail(ErrorCodeEnum.ARGUMENT_NULL_EXIST.getErrorMessage());
        }
        OnlineTable onlineTable = onlineTableService.getByIdWithRelation(tableId, MyRelationParam.full());
        if (onlineTable == null) {
            return R.fail(ErrorCodeEnum.DATA_NOT_EXIST.getErrorMessage());
        }
        return R.data(OnlineTableWrapper.build().entityVO(onlineTable));
    }

    /**
     * 以字典形式返回全部数据表数据集合。字典的键值为[tableId, modelName]。
     * 白名单接口，登录用户均可访问。
     *
     * @param filter 过滤对象。
     * @return 应答结果对象，包含的数据为 List<Map<String, String>>，map中包含两条记录，key的值分别是id和name，value对应具体数据。
     */
    @GetMapping("/listDict")
    public R<List<Map<String, Object>>> listDict(OnlineTable filter) {
        List<OnlineTable> resultList = onlineTableService.getOnlineTableList(filter, null);
        return R.data(BeanQuery.select(
                "tableId as id", "modelName as name").executeFrom(resultList));
    }
}
